package com.whf.android.jar.util.x509;

import android.annotation.SuppressLint;

import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;

/**
 * 实现X509证书信任管理器类（避免导证书）
 *
 * @author af
 * @version 1.0
 */
@SuppressLint("CustomX509TrustManager")
public class MyX509TrustManager implements TrustManager, X509TrustManager {


    /**
     * 该方法检查客户端的证书，若不信任该证书则抛出异常。由于我们不需要对客户端进行认证，
     * 因此我们只需要执行默认的信任管理器的这个方法。JSSE中，默认的信任管理器类为TrustManager。
     */
    @SuppressLint("TrustAllX509TrustManager")
    public void checkClientTrusted(X509Certificate[] chain, String authType) {

    }


    /**
     * 该方法检查服务器的证书，若不信任该证书同样抛出异常。通过自己实现该方法，可以使之信任我们指定的任何证书。
     * 在实现该方法时，也可以简单的不做任何处理，即一个空的函数体，由于不会抛出异常，它就会信任任何证书。
     */
    @SuppressLint("TrustAllX509TrustManager")
    public void checkServerTrusted(X509Certificate[] chain, String authType) {
        if (chain == null) {
            throw new IllegalArgumentException("Check Server x509Certificates is null");
        }
        if (chain.length == 0) {
            throw new IllegalArgumentException("Check Server x509Certificates is empty");
        }
        for (X509Certificate cert : chain) {
            //检查服务端证书是否过期
            try {
                cert.checkValidity();
            } catch (CertificateExpiredException | CertificateNotYetValidException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 返回受信任的X509证书数组。
     */
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[]{};
    }

    public boolean isServerTrusted(X509Certificate[] certs) {
        return true;
    }

    public boolean isClientTrusted(X509Certificate[] certs) {
        return true;
    }
}